County Racial Diversity and Candidate Victory Margin
This scatterplot shows the relationship between racial diversity (as expressed by the Inverse Simpson Diversity Index) and the percentage of the vote (excluding third parties) that Hillary Clinton won in each county in 2016.
df <- PresidentialElectionResults2016 %>%
inner_join(CountyCharacteristics %>% select(-State), by="County") %>%
mutate(TotalPopulation=TotalPopulation/1000) %>%
select(State, CountyName, dDRPct, SimpsonDiversityIndex, TotalPopulation)
sdf <- PresidentialElectionResults2016 %>%
group_by(State) %>%
summarize_each("sum", clinton, trump) %>%
mutate(winner=ifelse(clinton > trump, 'Clinton', 'Trump'))
df <- inner_join(df, sdf, by='State')
ggplot(data=df, aes(x=SimpsonDiversityIndex, y=dDRPct)) + geom_point(aes(size=TotalPopulation, colour=winner)) +
scale_color_manual(values=c('blue', 'red')) +
theme_economist() +
labs(x='Inverse Simpson Diversity Index', y='Clinton margin (excludes third-parties)',
size='County Population (x1000)', colour='Statewide Winner')

Voter Impact Analysis
This bar chart shows the relative “impact” of a citizen’s vote in each state, due to the disparity in the number of citizens per electoral vote across the states. It is expressed in terms of the number of “extra votes” a state gets (or gives up) by having a smaller (or larger) number of voters per electoral college vote.
PartyRegistration2016 <- PartyRegistration %>% filter(Year==2016 & Month==11)
df <- PartyRegistration2016 %>%
group_by(StateAbbr) %>%
summarize(RV=sum(Total)) %>%
inner_join(ElectoralVotes2010, by=c('StateAbbr'='StateAbbr')) %>%
mutate(RVorig=RV, RV=RV/100000,
EVPer100KVoters=ElectoralVotes/RV,
avgEVPer100KVoters=538/sum(RV),
extraVoters=(ElectoralVotes/avgEVPer100KVoters) - RV)
df2 <- PresidentialElectionResults2016 %>%
group_by(StateAbbr) %>%
summarize_each("sum", clinton, trump) %>%
mutate(winner=ifelse(clinton > trump, 'Clinton', 'Trump')) %>%
select(StateAbbr, winner)
df <- inner_join(df, df2, by=c('StateAbbr'='StateAbbr'))
ggplot(data=df, aes(x=reorder(StateAbbr, extraVoters), y=extraVoters, fill=winner)) + geom_bar(stat='identity') +
labs(y='"Extra" Voters (x100,000)', x=element_blank(),
title='Variance in the Impact of Votes',
subtitle='Expressed as the effective # of "extra" voters in each state') +
scale_fill_manual(values=c('blue', 'red')) +
geom_text(data=df %>% filter(extraVoters < 0),
aes(label=StateAbbr, y=extraVoters), vjust=1.3) +
geom_text(data=df %>% filter(extraVoters >= 0),
aes(label=StateAbbr, y=extraVoters), vjust=-1.1) +
theme_economist() + theme(axis.text.x=element_blank(),
axis.line.x=element_blank(),
axis.ticks.x=element_blank())

2016 Results Choropleth
Demonstrating how to draw a map of a state, with the counties shaded by the share of the vote for Clinton (blue) vs. Trump (red).
stateDemocraticRepublicanChoropleth(PresidentialElectionResults2016, 'PA', labels=TRUE, RDRatioColumnName='rDRPct',
caption='Percent of votes for Republican candidate (Red) versus Democratic candidate (Blue) (excluding third-party and write-in votes)',
titleFunction=function(stateName) {
paste0("2016 Presidential Election Results for ", stateName)
})

Party Registration Choropleth
We can also draw a map using voter registration / party affiliation, using the same function as above.
pr <- PartyRegistration %>% filter(Year==2016 & Month==11)
stateDemocraticRepublicanChoropleth(pr, 'FL', labels=TRUE, RDRatioColumnName='rDRPct',
caption='Percent of voters registered as Republican (Red) versus Democratic (Blue) among voters affiliated with those two parties',
titleFunction=function(stateName) {
paste0("2016 Voter Registration Party Affiliation for ", stateName) })

LS0tCnRpdGxlOiAiQmFzaWMgdXNlbGVjdGlvbnMgdmlzdWFsaXphdGlvbnMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIGVjaG89RkFMU0V9CmxpYnJhcnkodXNlbGVjdGlvbnMpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3RoZW1lcykKc291cmNlKCdHZW8uUicpCmBgYAoKIyMjIENvdW50eSBSYWNpYWwgRGl2ZXJzaXR5IGFuZCBDYW5kaWRhdGUgVmljdG9yeSBNYXJnaW4KClRoaXMgc2NhdHRlcnBsb3Qgc2hvd3MgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHJhY2lhbCBkaXZlcnNpdHkgKGFzIGV4cHJlc3NlZCBieSB0aGUgSW52ZXJzZSBTaW1wc29uIERpdmVyc2l0eSBJbmRleCkgYW5kIHRoZSBwZXJjZW50YWdlIG9mCnRoZSB2b3RlIChleGNsdWRpbmcgdGhpcmQgcGFydGllcykgdGhhdCBIaWxsYXJ5IENsaW50b24gd29uIGluIGVhY2ggY291bnR5IGluIDIwMTYuCmBgYHtyIGZpZy53aWR0aD0xMH0KZGYgPC0gUHJlc2lkZW50aWFsRWxlY3Rpb25SZXN1bHRzMjAxNiAlPiUKICAgIGlubmVyX2pvaW4oQ291bnR5Q2hhcmFjdGVyaXN0aWNzICU+JSBzZWxlY3QoLVN0YXRlKSwgYnk9IkNvdW50eSIpICU+JQogICAgbXV0YXRlKFRvdGFsUG9wdWxhdGlvbj1Ub3RhbFBvcHVsYXRpb24vMTAwMCkgJT4lCiAgICBzZWxlY3QoU3RhdGUsIENvdW50eU5hbWUsIGREUlBjdCwgU2ltcHNvbkRpdmVyc2l0eUluZGV4LCBUb3RhbFBvcHVsYXRpb24pCgogIHNkZiA8LSBQcmVzaWRlbnRpYWxFbGVjdGlvblJlc3VsdHMyMDE2ICU+JQogICAgZ3JvdXBfYnkoU3RhdGUpICU+JQogICAgc3VtbWFyaXplX2VhY2goInN1bSIsIGNsaW50b24sIHRydW1wKSAlPiUKICAgIG11dGF0ZSh3aW5uZXI9aWZlbHNlKGNsaW50b24gPiB0cnVtcCwgJ0NsaW50b24nLCAnVHJ1bXAnKSkKCiAgZGYgPC0gaW5uZXJfam9pbihkZiwgc2RmLCBieT0nU3RhdGUnKQoKICBnZ3Bsb3QoZGF0YT1kZiwgYWVzKHg9U2ltcHNvbkRpdmVyc2l0eUluZGV4LCB5PWREUlBjdCkpICsgZ2VvbV9wb2ludChhZXMoc2l6ZT1Ub3RhbFBvcHVsYXRpb24sIGNvbG91cj13aW5uZXIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoJ2JsdWUnLCAncmVkJykpICsKICAgIHRoZW1lX2Vjb25vbWlzdCgpICsKICAgIGxhYnMoeD0nSW52ZXJzZSBTaW1wc29uIERpdmVyc2l0eSBJbmRleCcsIHk9J0NsaW50b24gbWFyZ2luIChleGNsdWRlcyB0aGlyZC1wYXJ0aWVzKScsCiAgICAgICAgIHNpemU9J0NvdW50eSBQb3B1bGF0aW9uICh4MTAwMCknLCBjb2xvdXI9J1N0YXRld2lkZSBXaW5uZXInKQpgYGAKIyMjIFZvdGVyIEltcGFjdCBBbmFseXNpcwoKVGhpcyBiYXIgY2hhcnQgc2hvd3MgdGhlIHJlbGF0aXZlICJpbXBhY3QiIG9mIGEgY2l0aXplbidzIHZvdGUgaW4gZWFjaCBzdGF0ZSwgZHVlIHRvIHRoZSBkaXNwYXJpdHkgaW4gdGhlIG51bWJlciBvZiBjaXRpemVucyBwZXIgZWxlY3RvcmFsIHZvdGUgYWNyb3NzIHRoZSBzdGF0ZXMuICBJdCBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YgdGhlIG51bWJlciBvZiAiZXh0cmEgdm90ZXMiIGEgc3RhdGUgZ2V0cyAob3IgZ2l2ZXMgdXApIGJ5IGhhdmluZyBhIHNtYWxsZXIgKG9yIGxhcmdlcikgbnVtYmVyIG9mIHZvdGVycyBwZXIgZWxlY3RvcmFsIGNvbGxlZ2Ugdm90ZS4KCmBgYHtyIGZpZy53aWR0aD0xMn0KCgogIFBhcnR5UmVnaXN0cmF0aW9uMjAxNiA8LSBQYXJ0eVJlZ2lzdHJhdGlvbiAlPiUgZmlsdGVyKFllYXI9PTIwMTYgJiBNb250aD09MTEpCgogIGRmIDwtIFBhcnR5UmVnaXN0cmF0aW9uMjAxNiAlPiUKICAgIGdyb3VwX2J5KFN0YXRlQWJicikgJT4lCiAgICBzdW1tYXJpemUoUlY9c3VtKFRvdGFsKSkgJT4lCiAgICBpbm5lcl9qb2luKEVsZWN0b3JhbFZvdGVzMjAxMCwgYnk9YygnU3RhdGVBYmJyJz0nU3RhdGVBYmJyJykpICU+JQogICAgbXV0YXRlKFJWb3JpZz1SViwgUlY9UlYvMTAwMDAwLAogICAgICAgICAgIEVWUGVyMTAwS1ZvdGVycz1FbGVjdG9yYWxWb3Rlcy9SViwKICAgICAgICAgICBhdmdFVlBlcjEwMEtWb3RlcnM9NTM4L3N1bShSViksCiAgICAgICAgICAgZXh0cmFWb3RlcnM9KEVsZWN0b3JhbFZvdGVzL2F2Z0VWUGVyMTAwS1ZvdGVycykgLSBSVikKCiAgZGYyIDwtIFByZXNpZGVudGlhbEVsZWN0aW9uUmVzdWx0czIwMTYgJT4lCiAgICBncm91cF9ieShTdGF0ZUFiYnIpICU+JQogICAgc3VtbWFyaXplX2VhY2goInN1bSIsIGNsaW50b24sIHRydW1wKSAlPiUKICAgIG11dGF0ZSh3aW5uZXI9aWZlbHNlKGNsaW50b24gPiB0cnVtcCwgJ0NsaW50b24nLCAnVHJ1bXAnKSkgJT4lCiAgICBzZWxlY3QoU3RhdGVBYmJyLCB3aW5uZXIpCgogIGRmIDwtIGlubmVyX2pvaW4oZGYsIGRmMiwgYnk9YygnU3RhdGVBYmJyJz0nU3RhdGVBYmJyJykpCgogIGdncGxvdChkYXRhPWRmLCBhZXMoeD1yZW9yZGVyKFN0YXRlQWJiciwgZXh0cmFWb3RlcnMpLCB5PWV4dHJhVm90ZXJzLCBmaWxsPXdpbm5lcikpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArCiAgICBsYWJzKHk9JyJFeHRyYSIgVm90ZXJzICh4MTAwLDAwMCknLCB4PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgdGl0bGU9J1ZhcmlhbmNlIGluIHRoZSBJbXBhY3Qgb2YgVm90ZXMnLAogICAgICAgICBzdWJ0aXRsZT0nRXhwcmVzc2VkIGFzIHRoZSBlZmZlY3RpdmUgIyBvZiAiZXh0cmEiIHZvdGVycyBpbiBlYWNoIHN0YXRlJykgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoJ2JsdWUnLCAncmVkJykpICsKICAgIGdlb21fdGV4dChkYXRhPWRmICU+JSBmaWx0ZXIoZXh0cmFWb3RlcnMgPCAwKSwKICAgICAgICAgICAgICBhZXMobGFiZWw9U3RhdGVBYmJyLCB5PWV4dHJhVm90ZXJzKSwgdmp1c3Q9MS4zKSArCiAgICBnZW9tX3RleHQoZGF0YT1kZiAlPiUgZmlsdGVyKGV4dHJhVm90ZXJzID49IDApLAogICAgICAgICAgICAgIGFlcyhsYWJlbD1TdGF0ZUFiYnIsIHk9ZXh0cmFWb3RlcnMpLCB2anVzdD0tMS4xKSArCiAgICB0aGVtZV9lY29ub21pc3QoKSArIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy5saW5lLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpKQoKYGBgCgojIyMgMjAxNiBSZXN1bHRzIENob3JvcGxldGgKCkRlbW9uc3RyYXRpbmcgaG93IHRvIGRyYXcgYSBtYXAgb2YgYSBzdGF0ZSwgd2l0aCB0aGUgY291bnRpZXMgc2hhZGVkIGJ5IHRoZSBzaGFyZSBvZiB0aGUgdm90ZSBmb3IgQ2xpbnRvbiAoYmx1ZSkgdnMuIFRydW1wIChyZWQpLgpgYGB7ciBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRX0Kc3RhdGVEZW1vY3JhdGljUmVwdWJsaWNhbkNob3JvcGxldGgoUHJlc2lkZW50aWFsRWxlY3Rpb25SZXN1bHRzMjAxNiwgJ1BBJywgbGFiZWxzPVRSVUUsIFJEUmF0aW9Db2x1bW5OYW1lPSdyRFJQY3QnLAogICAgICBjYXB0aW9uPSdQZXJjZW50IG9mIHZvdGVzIGZvciBSZXB1YmxpY2FuIGNhbmRpZGF0ZSAoUmVkKSB2ZXJzdXMgRGVtb2NyYXRpYyBjYW5kaWRhdGUgKEJsdWUpIChleGNsdWRpbmcgdGhpcmQtcGFydHkgYW5kIHdyaXRlLWluIHZvdGVzKScsCiAgICAgIHRpdGxlRnVuY3Rpb249ZnVuY3Rpb24oc3RhdGVOYW1lKSB7CiAgICAgIHBhc3RlMCgiMjAxNiBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gUmVzdWx0cyBmb3IgIiwgc3RhdGVOYW1lKQogICAgfSkKYGBgCgojIyMgUGFydHkgUmVnaXN0cmF0aW9uIENob3JvcGxldGgKCldlIGNhbiBhbHNvIGRyYXcgYSBtYXAgdXNpbmcgdm90ZXIgcmVnaXN0cmF0aW9uIC8gcGFydHkgYWZmaWxpYXRpb24sIHVzaW5nIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIGFib3ZlLgpgYGB7ciBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRX0KcHIgPC0gUGFydHlSZWdpc3RyYXRpb24gJT4lIGZpbHRlcihZZWFyPT0yMDE2ICYgTW9udGg9PTExKQpzdGF0ZURlbW9jcmF0aWNSZXB1YmxpY2FuQ2hvcm9wbGV0aChwciwgJ0ZMJywgbGFiZWxzPVRSVUUsIFJEUmF0aW9Db2x1bW5OYW1lPSdyRFJQY3QnLAogICAgICBjYXB0aW9uPSdQZXJjZW50IG9mIHZvdGVycyByZWdpc3RlcmVkIGFzIFJlcHVibGljYW4gKFJlZCkgdmVyc3VzIERlbW9jcmF0aWMgKEJsdWUpIGFtb25nIHZvdGVycyBhZmZpbGlhdGVkIHdpdGggdGhvc2UgdHdvIHBhcnRpZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUZ1bmN0aW9uPWZ1bmN0aW9uKHN0YXRlTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiMjAxNiBWb3RlciBSZWdpc3RyYXRpb24gUGFydHkgQWZmaWxpYXRpb24gZm9yICIsIHN0YXRlTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQpgYGAKCgo=